package LogicaClasesNew;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlTransient;

@XmlAccessorType(XmlAccessType.FIELD)
@Entity
@Table(name="OrdenesCompra") 
public class OrdenCompra implements Serializable {

//INICIO DEFINICION DE ATRIBUTOS
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@XmlElement
private int Numero;

@XmlElement
private String FechaOrden;

@XmlElement
private String FechaOrdenP; //fecha preparada

@XmlElement
private String FechaOrdenC; //fecha confirmada

@XmlElement
private float precioTotal;

@XmlElement
private boolean bajaLogica;

@ManyToOne
@JoinColumn(name="Nickname")
@XmlElement
private Cliente cliente;
//Cada orden tiene asociada 1 instancia de cliente
@OneToMany 
//@XmlElement
@XmlTransient
private List<LineaOrden> listalineaorden; //Cada orden tiene un listado de LineaOrden.

@Enumerated(EnumType.STRING)
@XmlElement
private Estado estado;
//FIN DEFINICION DE ATRIBUTOS
        
    
//COMIENZO DEFINICION DE CONSTRUCTORES

public OrdenCompra() {
    listalineaorden = new ArrayList<LineaOrden>();
}

public OrdenCompra(String FechaOrden, float precioTotal, Cliente cliente, Estado estado) {
    this.FechaOrden = FechaOrden;
    this.precioTotal = precioTotal;
    this.cliente = cliente;
    this.estado=estado;
    this.listalineaorden = new ArrayList<LineaOrden>();
    this.bajaLogica = false;
    this.FechaOrdenC="";
    this.FechaOrdenP="";
}
public OrdenCompra(int Numero, String FechaOrden, float precioTotal, Cliente cliente) {
    this.Numero = Numero;
    this.FechaOrden = FechaOrden;
    this.precioTotal = precioTotal;
    this.cliente = cliente;
    this.listalineaorden = new ArrayList<LineaOrden>();
    this.bajaLogica = false;
}

public OrdenCompra(String FechaOrden, float precioTotal) {
    this.FechaOrden = FechaOrden;
    this.precioTotal = precioTotal;
    this.listalineaorden = new ArrayList<LineaOrden>();
    this.bajaLogica = false;
}
    
//FIN DEFINICION DE CONSTRUCTORES
    

//COMIENZO DEFINICION DE METODOS

public Cliente getCliente() {
    return cliente; //retorna la instancia de cliente asignada
}
 
public void setCliente(Cliente cliente) {
    this.cliente = cliente; //seteo cliente de la OrdenCompra
}

    
public List<LineaOrden> getLineasOrden() {//Retorna el listado de lineas orden 
    return new ArrayList(listalineaorden);
}
    
public void addlineaorden(LineaOrden l) { //Me agrega una Linea orden a mi Ordende Compra
    listalineaorden.add(l);
}
    
public int getNumero() {
    return Numero;
}
   
public String getFechaOrden() {
    return FechaOrden;
}

public float getPrecioTotal() {
    return precioTotal;
}

public void setNumero(int Numero) {
    this.Numero = Numero;
}

public void setFechaOrden(String FechaOrden) {
    this.FechaOrden = FechaOrden;
}

public void setPrecioTotal(float precioTotal) {
    this.precioTotal = precioTotal;
}

public boolean isBajaLogica() {
    return bajaLogica;
}

public void setBajaLogica(boolean bajaLogica) {
    this.bajaLogica = bajaLogica;
}

public void setFechaOrdenP(String FechaOrdenP) {
    this.FechaOrdenP = FechaOrdenP;
}

public void setFechaOrdenC(String FechaOrdenC) {
    this.FechaOrdenC = FechaOrdenC;
}

public void setEstado(Estado estado) {
    this.estado = estado;
}

public String getFechaOrdenP() {
    return FechaOrdenP;
}

public String getFechaOrdenC() {
    return FechaOrdenC;
}

public Estado getEstado() {
    return estado;
}



//FIN DEFINICION DE METODOS


@Override
public int hashCode() {
    return super.hashCode(); //To change body of generated methods, choose Tools | Templates.
}
    

  

@Override
public boolean equals(Object obj) {
    if (obj == null) {
        return false;
    }
    if (getClass() != obj.getClass()) {
        return false;
    }
    final OrdenCompra other = (OrdenCompra) obj;
    if (this.Numero != other.Numero) {
        return false;
    }
    if (!Objects.equals(this.FechaOrden, other.FechaOrden)) {
        return false;
    }
    if (this.precioTotal != other.precioTotal) {
        return false;
    }
    return true;
}


    
}
